package com.demo.lengthFieldBasedFrameDecoder.custom;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.logging.LoggingHandler;
import sun.awt.EmbeddedFrame;

import java.nio.ByteBuffer;

public class TestMessageCodec {

    //编码，解码器，要配合之前的length,就怕半包的功能
    //都按照字节来解析了
    public static void main(String[] args) {

        //第1个属性是1024个真情解码器，
        //第2个字段，长度属性的字段是真解码器需要偏移12个字节
        //第3个字段，长度字段是4个字节
        //第4个字段，Length,Num + lengthAdjustment = 长度域后面的实际总长度,后面的内容长度和长度总字段相同，所以不需要调节。
        //init,后面的解码器，是否要跳过真解码器的字节数，我们看了不需要。我们的codec是自己解码出来的，自己去解码哪些肖字节数。

        //自己做编码，解码器，需要定义好长度值。
        EmbeddedChannel channel = new EmbeddedChannel(
                new LengthFieldBasedFrameDecoder(1024,12,4,0,0),
                new LoggingHandler(),
                new MessageCodec());

        //encode
        Message message = new Message();
        message.setSequenceId(100);
        message.setContent("我爱的我");
        channel.writeOutbound(message);//出展,会走encode 方法

        //decode，读取数据先要解码
        ByteBuf buf = ByteBufAllocator.DEFAULT.buffer();

        try {
            new MessageCodec().encode(null,message,buf);
            channel.writeInbound(buf);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
